package com.jmeter.test;


import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

/**
 * @author: liuhe
 */
public class MyFristFunction extends AbstractFunction {

    //自定义function的描述
    private static final List<String> params = new LinkedList<String>();

    static {
        params.add("请输入第一个参数");
        params.add("请输入第二个参数");
    }

    public static String param1;
    public static String param2;
    /**
     * function名称
     */
    private static final String KEY = "__ProductFunc";

    /**
     * 用来设置GUI界面的函数参数对话框,把自己定义的参数给显示在jmeter的GUI界面上
     *
     * @return
     */
    public List<String> getArgumentDesc() {
        // TODO Auto-generated method stub
        return params;
    }

    /**
     * 函数的逻辑执行主体,就是用户使用此函数之后返回的内容是什么，比如return "ty"，那么用户在jmeter使用
     *
     * @param arg0
     * @param arg1
     * @return
     * @throws InvalidVariableException
     */
    @Override
    public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException {
        try {
            Float a = Float.valueOf(param1);
            Float b = Float.valueOf(param1);
            Float c = a * b;
            return String.valueOf(c);
        } catch (Exception ex) {
            throw new InvalidVariableException(ex);
        }
    }

    /**
     * 用来接收和处理GUI界面的参数的传值
     *
     * @param arg0
     * @throws InvalidVariableException
     */
    @Override
    public void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException {
        //先将接收的参数转成数组，values接收页面上传过来的多个值，用数组的形式存储
        Object[] values = arg0.toArray();
//然后使用CompoundVariable提供的execute()方法将值转成toString
        param1 = ((CompoundVariable) values[0]).execute();
        param2 = ((CompoundVariable) values[1]).execute();
    }

    /**
     * 用来定义函数的名称，把自己定义的内容显示在函数对话框中
     *
     * @return
     */
    @Override
    public String getReferenceKey() {
        return KEY;
    }
}

